/**
 * 数组列表
 *
 * @author jacob
 * @date 2025/6/6 14:52
 */

#pragma once
#ifndef ArrayList_h
#define ArrayList_h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#include "Node.h"

/*
 * 数组列表初始化大小为10
 */
const static int ARRAY_LIST_INIT_CAPACITY = 10;

/*
 * 数组列表
 */
typedef struct ArrayList {
	Node* data;
	int length;
	int capacity;
} ArrayList;

/*
 * 数组列表初始化
 *
 * @return 数组列表指针.NULL-数组列表初始化失败
 */
ArrayList* initArrayList(void);

/*
 * 数组列表销毁
 *
 * @param list 数组列表指针
 * @return true-数组列表销毁成功;false-数组列表销毁失败
 */
bool destroyArrayList(ArrayList* list);

/*
 * 数组列表长度
 *
 * @param list 数组列表指针
 * @return 数组列表长度
 */
int sizeArrayList(ArrayList* list);

/*
 * 数组列表容量
 *
 * @param list 数组列表指针
 * @return 数组列表容量
 */
int capacityArrayList(ArrayList* list);

/*
 * 数组列表是否为空
 *
 * @param list 数组列表指针
 * @return true-数组列表为空;false-数组列表不为空
 */
bool isEmptyArrayList(ArrayList* list);

/*
 * 数组列表插入节点
 * (时间复杂度O(n))
 *
 * @param list 数组列表指针
 * @param index 索引位置
 * @param Node 待插入数组列表的节点
 * @return true-插入节点到数组列表成功;false-插入节点到数组列表失败
 */
bool insertArrayList(ArrayList* list, int index, Node* value);

/*
 * 数组列表删除节点
 * (时间复杂度O(n))
 *
 * @param list 数组列表指针
 * @param index 索引位置
 * @return true-数组列表删除节点成功;false-数组列表删除节点失败
 */
bool removeArrayList(ArrayList* list, int index);

/*
 * 数组列表获取节点
 (时间复杂度O(1))
 *
 * @param list 数组列表指针
 * @param index 索引位置
 * @return Node*-节点指针
 */
Node* getArrayList(ArrayList* list, int index);

/*
 * 数组列表设置节点
 * (时间复杂度O(1))
 *
 * @param list 数组列表指针
 * @param index 索引位置
 * @return true-数组列表设置节点成功;false-数组列表设置节点失败
 */
bool setArrayList(ArrayList* list, int index, Node* value);

#endif /* ArrayList_h */
